package com.tbynet.jwp.admin.post;

import com.jfinal.aop.Inject;
import com.jfinal.kit.Ret;
import com.jfinal.plugin.activerecord.Record;
import com.tbynet.jwp.admin.AdminController;
import com.tbynet.jwp.repository.spi.PostStatService;

import java.util.List;

/**
 * 文章统计控制器
 * @ClassName: PostStatsController
 * @Description: 提供文章相关的数据统计和分析功能
 * @Author: 佰亿互联
 * @Date: 2019年3月22日 下午3:05:05
 *
 * @Copyright: 2019 www.tbynet.com Inc. All rights reserved.
 * 注意: 本内容仅限于内部传阅，禁止外泄以及用于其他的商业目
 */
public class PostStatsController extends AdminController {

    @Inject
    private PostStatService postStatService;

    /**
     * 文章统计概览页面
     * 展示文章的整体统计信息，包括文章数量、分类分布、作者贡献等
     */
    public void overview() {
        // 获取热门分类统计
        List<Record> popularCategories = postStatService.getPopularCategories();
        set("popularCategories", popularCategories);

        // 获取分类分布统计
        List<Record> categoryDistribution = postStatService.getCategoryDistribution();
        set("categoryDistribution", categoryDistribution);

        // 获取标签统计
        List<Record> tagStats = postStatService.getTagStats();
        set("tagStats", tagStats);

        // 获取作者活动统计
        List<Record> authorStats = postStatService.getAuthorActivityStats();
        set("authorStats", authorStats);

        render("stats.html");
    }

    /**
     * 获取文章趋势数据API
     * 支持按月、周、日不同维度获取文章发布趋势
     *
     * 参数 period 时间周期，可选值：month-月度, week-周度, day-日度
     */
    public void trend() {
        String period = getPara("period", "month"); // month, week, day

        try {
            validatePeriod(period);
            List<Record> trendData = postStatService.getTrendData(period);
            ok(Ret.by("data", trendData).set("period", period));
        } catch (IllegalArgumentException e) {
            fail("不支持的统计周期: " + period);
        }
    }

    /**
     * 获取作者贡献统计API
     * 统计各作者的文章数量、最后发文时间等信息
     */
    public void authorContribution() {
        try {
            List<Record> authorStats = postStatService.getAuthorActivityStats();
            ok(Ret.by("data", authorStats));
        } catch (Exception e) {
            fail("获取作者贡献统计失败: " + e.getMessage());
        }
    }

    /**
     * 获取分类文章分布API
     * 统计各分类下的文章数量及占比
     */
    public void categoryDistribution() {
        try {
            List<Record> categories = postStatService.getCategoryDistribution();
            ok(Ret.by("data", categories));
        } catch (Exception e) {
            fail("获取分类分布统计失败: " + e.getMessage());
        }
    }

    /**
     * 获取月度趋势数据API
     */
    public void monthlyTrend() {
        try {
            List<Record> monthlyData = postStatService.getMonthlyTrend();
            ok(Ret.by("data", monthlyData));
        } catch (Exception e) {
            fail("获取月度趋势数据失败: " + e.getMessage());
        }
    }

    /**
     * 获取周度趋势数据API
     */
    public void weeklyTrend() {
        try {
            List<Record> weeklyData = postStatService.getWeeklyTrend();
            ok(Ret.by("data", weeklyData));
        } catch (Exception e) {
            fail("获取周度趋势数据失败: " + e.getMessage());
        }
    }

    /**
     * 获取日度趋势数据API
     */
    public void dailyTrend() {
        try {
            List<Record> dailyData = postStatService.getDailyTrend();
            ok(Ret.by("data", dailyData));
        } catch (Exception e) {
            fail("获取日度趋势数据失败: " + e.getMessage());
        }
    }

    /**
     * 验证统计周期参数
     *
     * @param period 统计周期
     * @throws IllegalArgumentException 当周期参数不合法时抛出异常
     */
    private void validatePeriod(String period) {
        if (!"month".equals(period) && !"week".equals(period) && !"day".equals(period)) {
            throw new IllegalArgumentException("统计周期必须是 month、week 或 day");
        }
    }
}
